package ${filePackageName};

import ${utilPackage}.ConstantUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.parser.Feature;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

import java.util.List;

/**
 * 返回结果
 * @author ${projectAuthor}
 * @version 1.0
 * @date ${nowDate}
 */
@ApiModel(value = "请求结果", description = "请求结果")
public class Response<T> {

    @ApiModelProperty(value = "返回代码 200成功 其它失败",example = "200")
    private int code;

    @JsonInclude(JsonInclude.Include.NON_NULL)
    @ApiModelProperty("消息")
    private String message;

    @ApiModelProperty(value = "分页集合")
    private T data;

    @JsonInclude(JsonInclude.Include.NON_NULL)
    @ApiModelProperty(value = "总数")
    private Long total;

    public Response(int code, T data, long total,String message) {
        this.code = code;
        this.data = data;
        this.total = total;
        this.message = message;
    }

    public Response(int code, T data, long total) {
        this.code = code;
        this.data = data;
        this.total = total;
    }

    public Response(int code, T data,String message) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public Response(int code, T data) {
        this.code = code;
        this.data = data;
    }

    public Response(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public Long getTotal() {
        return total;
    }

    public void setTotal(Long total) {
        this.total = total;
    }

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }

    /**
     * 操作成功
     * @param message 消息
     * @return 消息结果
     */
    public static Response message(int code,String message){
        return new Response(code,message);
    }

    /**
     * 操作成功
     * @param message 消息
     * @return 消息结果
     */
    public static Response success(String message){
        return new Response(ConstantUtil.CODE_200,message);
    }

    /**
     * 操作失败
     * @param message 消息
     * @return 消息结果
     */
    public static Response failure(String message){
        return new Response(ConstantUtil.CODE_500,message);
    }

    /**
     * 拒绝访问
     * @param message 消息
     * @return 消息结果
     */
    public static Response forbidden(String message){
        return new Response(ConstantUtil.CODE_403,message);
    }

    /**
     * 参数错误
     * @param message 消息
     * @return 消息结果
     */
    public static Response paramError(String message){
        return new Response(ConstantUtil.CODE_404,message);
    }

    /**
     * authorization过期或为空
     * @param message 消息
     * @return 消息结果
     */
    public static Response authorizationDeny(String message){
        return new Response(ConstantUtil.CODE_406,message);
    }

    /**
     * 返回对象
     * @param data 数据
     * @return 结果对象
     * @param <T> 数据类型
     */
    public static <T> Response<T> data(T data){
        return new Response<T>(ConstantUtil.CODE_200,data);
    }

    /**
     * 返回对象
     * @param data 数据
     * @return 结果对象
     * @param <T> 数据类型
     */
    public static <T> Response<T> data(T data,String message){
        return new Response<T>(ConstantUtil.CODE_200,data,message);
    }


    /**
     * 返回分页查询集合
     * @param page 分页数据
     * @param <T> 数据类型
     * @return 分页结果
     */
    public static <T> Response<List<T>> page(Page<T> page){
        return new Response<List<T>>(ConstantUtil.CODE_200,page.getRecords(),page.getTotal());
    }

    /**
     * 返回分页查询集合
     * @param page 分页数据
     * @param <T> 数据类型
     * @return 分页结果
     */
    public static <T> Response<List<T>> page(Page<T> page,String message){
        return new Response<List<T>>(ConstantUtil.CODE_200,page.getRecords(),page.getTotal(),message);
    }


    /**
     * 返回分页查询集合
     * @param data 集合数据
     * @param total 总数
     * @param <T> 数据类型
     * @return 分页结果
     */
    public static <T> Response<T> page(T data, long total){
        return new Response<T>(ConstantUtil.CODE_200,data,total);
    }

    /**
     * 返回分页查询集合
     * @param data 集合数据
     * @param total 总数
     * @param <T> 数据类型
     * @return 分页结果
     */
    public static <T> Response<T> page(T data, long total,String message){
        return new Response<T>(ConstantUtil.CODE_200,data,total,message);
    }

    /**
     * 返回消息
     * @param flag 是否成功
     * @param messagePrefix 消息前缀
     * @return 消息结果
     */
    public static Response<Boolean> message(Boolean flag,String messagePrefix){
        return new Response(ConstantUtil.CODE_200,flag==true?(messagePrefix+"成功"):(messagePrefix+"失败"));
    }

    /**
     * json转换
     * @param json
     * @param type
     * @param <T>
     * @return
     */
    public static <T> Response<T> parseObject(String json, Class<T> type) {
        Response<T> response = JSON.parseObject(json, new TypeReference<Response<T>>(type) {}, Feature.OrderedField);
        return response;
    }

    /**
     * json转换
     * @param json
     * @param type
     * @param <T>
     * @return
     */
    public static <T> Response<List<T>> parseList(String json, Class<T> type) {
        Response<List<T>> response = JSON.parseObject(json, new TypeReference<Response<List<T>>>(type) {}, Feature.OrderedField);
        return response;
    }
}
